package tcp;

import java.io.IOException;
import java.net.Socket;
import java.util.concurrent.LinkedBlockingDeque;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
 * 线程池TCP回显服务器
 * 功能：使用线程池管理客户端连接处理线程，避免频繁创建销毁线程的开销
 * 继承自TCPEchoServer，重用其连接处理逻辑
 */
public class TCPThreadPoolServer extends TCPEchoServer {
    /**
     * 构造方法
     * @param port 服务端的端口号
     */
    public TCPThreadPoolServer(int port) throws IOException {
        super(port);
    }

    /**
     * 重写start方法，使用线程池处理客户端连接
     * @throws IOException 如果接受客户端连接失败
     */
    @Override
    public void start() throws IOException {
        System.out.println("服务器已启动，等待客户端连接.");
        // 创建一个线程池
        ThreadPoolExecutor threadPool = new ThreadPoolExecutor(
                3,  // 核心线程数：线程池保持的最小线程数
                10, // 最大线程数：线程池允许创建的最大线程数
                1,// 空闲线程存活时间：非核心线程空闲时的最大存活时间
                TimeUnit.SECONDS,// 时间单位：秒
                new LinkedBlockingDeque<>(1));// 工作队列：用于保存等待执行的任务，容量为1
        // 循环处理客户端连接
        while (true) {
            // 接收客户端连接
            Socket clientSocket = socket.accept();
            // 把处理连接的操作加入了线程池中
            threadPool.submit(() -> {
                // 子线程中处理连接数据
                processConnections(clientSocket);
            });
            // 线程池会自动管理线程的创建、回收和任务调度
        }
    }

    public static void main(String[] args) throws IOException {
        TCPThreadPoolServer server = new TCPThreadPoolServer(9999);
        server.start();
    }
}
